import {reactive} from './03_reactive.js'

// 判断是否为对象 ，注意排除 null
const isObject = val => val !== null && typeof val === 'object';

// 转换value: 如果val是对象, 生成对应的proxy对象返回 
const convert = val => isObject(val) ? reactive(val) : val;

// 用于创建ref对象的类
class RefImpl {
  constructor(value) {
    // 保存传入的值
    this._rawValue = value;
    // 保存当前是ref对象的标识
    this.__v_isRef = true;
    // 对value进行转换后保存
    this._value = convert(value);
  }
  // value属性的getter: 追踪收集依赖, 返回转换后的value
  get value() {
    // 追踪依赖
    console.log('收集依赖...')
    // 返回保存的转换后的value
    return this._value;
  }

  // value属性的setter: 对新的value进行转换后保存, 触发依赖effect执行
  set value(newValue) {
    // 如果value有变化
    if (newValue !== this._rawValue) {
      // 保存传入的value
      this._rawValue = newValue;
      // 对value转换后保存
      this._value = convert(newValue);
      // 触发依赖effect执行
      console.log('触发依赖...')
    }
  }
}

/* 
ref函数
*/
export function ref(value) {
  // 如果value是ref对象, 直接返回它
  if (isObject(value) && value.__v_isRef) return value;
  // 创建对应的ref对象, 并返回
  return new RefImpl(value);
}